// noinspection JSUnresolvedReference
/**
* Field Google Map
*/
/* global jQuery, document, redux_change, redux, google */
(function ( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.google_maps = redux.field_objects.google_maps || {};
/* LIBRARY INIT */
redux.field_objects.google_maps.init = function ( selector ) {
if ( ! selector ) {
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' );
}
$( selector ).each(
function ( i ) {
let delayRender;
const el = $( this );
let parent = el;
if ( ! el.hasClass( 'redux-field-container' ) ) {
parent = el.parents( '.redux-field-container:first' );
}
if ( parent.is( ':hidden' ) ) {
return;
}
if ( parent.hasClass( 'redux-field-init' ) ) {
parent.removeClass( 'redux-field-init' );
} else {
return;
}
// Check for delay render, which is useful for calling a map
// render after JavaScript load.
delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) );
// API Key button.
redux.field_objects.google_maps.clickHandler( el );
// Init our maps.
redux.field_objects.google_maps.initMap( el, i, delayRender );
}
);
};
/* INIT MAP FUNCTION */
redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) {
let delayed;
let scrollWheel;
let streetView;
let mapType;
let address;
let defLat;
let defLong;
let defaultZoom;
let mapOptions;
let geocoder;
let g_autoComplete;
let g_LatLng;
let g_map;
let noLatLng = false;
// Pull the map class.
const mapClass = el.find( '.redux_framework_google_maps' );
const containerID = mapClass.attr( 'id' );
const autocomplete = containerID + '_autocomplete';
const canvas = containerID + '_map_canvas';
const canvasId = $( '#' + canvas );
const latitude = containerID + '_latitude';
const longitude = containerID + '_longitude';
// Add map index to data attr.
// Why, say we want to use delay_render,
// and want to init the map later on.
// You'd need the index number in the
// event of multiple map instances.
// This allows one to retrieve it
// later.
$( mapClass ).attr( 'data-idx', idx );
if ( true === delayRender ) {
return;
}
// Map has been rendered, no need to process again.
if ( $( '#' + containerID ).hasClass( 'rendered' ) ) {
return;
}
// If a map is set to delay render and has been initiated
// from another scrip, add the 'render' class so rendering
// does not occur.
// It messes things up.
delayed = Boolean( mapClass.data( 'delay-render' ) );
if ( true === delayed ) {
mapClass.addClass( 'rendered' );
}
// Create the autocomplete object, restricting the search
// to geographical location types.
g_autoComplete = await google.maps.importLibrary( 'places' );
g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} );
// Data bindings.
scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) );
streetView = Boolean( mapClass.data( 'street-view' ) );
mapType = Boolean( mapClass.data( 'map-type' ) );
address = mapClass.data( 'address' );
address = decodeURIComponent( address );
address = address.trim();
// Set default Lat/lng.
defLat = canvasId.data( 'default-lat' );
defLong = canvasId.data( 'default-long' );
defaultZoom = canvasId.data( 'default-zoom' );
// Eval whether to set maps based on lat/lng or address.
if ( '' !== address ) {
if ( '' === defLat || '' === defLong ) {
noLatLng = true;
}
} else {
noLatLng = false;
}
// Can't have empty values, or the map API will complain.
// Set default for the middle of the United States.
defLat = defLat ? defLat : 39.11676722061108;
defLong = defLong ? defLong : -100.47761000000003;
if ( noLatLng ) {
// If displaying a map based on an address.
geocoder = new google.maps.Geocoder();
// Set up Geocode and pass address.
geocoder.geocode(
{'address': address},
function ( results, status ) {
let latitude;
let longitude;
// Function results.
if ( status === google.maps.GeocoderStatus.OK ) {
// A good address was passed.
g_LatLng = results[0].geometry.location;
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom,
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
// Get and set lat/long data.
latitude = el.find( '#' + containerID + '_latitude' );
latitude.val( results[0].geometry.location.lat() );
longitude = el.find( '#' + containerID + '_longitude' );
longitude.val( results[0].geometry.location.lng() );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
} else {
// No data found, alert the user.
alert( 'Geocode was not successful for the following reason: ' + status );
}
}
);
} else {
// If displaying map based on an lat/lng.
g_LatLng = new google.maps.LatLng( defLat, defLong );
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom, // Start off far unless an item is selected, set by php.
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create the map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
}
};
redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) {
let markerTooltip;
let infoWindow;
let g_marker;
let geoAlert = mapClass.data( 'geo-alert' );
// Get HTML.
const input = document.getElementById( autocomplete );
// Set objects into the map.
g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input );
// Bind objects to the map.
g_autoComplete = new google.maps.places.Autocomplete( input );
g_autoComplete.bindTo( 'bounds', g_map );
// Get the marker tooltip data.
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Create infoWindow.
infoWindow = new google.maps.InfoWindow();
// Create marker.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
draggable: true,
title: markerTooltip,
animation: google.maps.Animation.DROP
}
);
geoAlert = decodeURIComponent( geoAlert );
// Place change.
google.maps.event.addListener(
g_autoComplete,
'place_changed',
function () {
let place;
let address;
let markerTooltip;
infoWindow.close();
// Get place data.
place = g_autoComplete.getPlace();
// Display alert if something went wrong.
if ( ! place.geometry ) {
window.alert( geoAlert );
return;
}
console.log( place.geometry.viewport );
// If the place has a geometry, then present it on a map.
if ( place.geometry.viewport ) {
g_map.fitBounds( place.geometry.viewport );
} else {
g_map.setCenter( place.geometry.location );
g_map.setZoom( 17 ); // Why 17? Because it looks good.
}
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Set the marker icon.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
title: markerTooltip,
clickable: true,
draggable: true,
animation: google.maps.Animation.DROP
}
);
// Set marker position and display.
g_marker.setPosition( place.geometry.location );
g_marker.setVisible( true );
// Form array of address components.
address = '';
if ( place.address_components ) {
address = [( place.address_components[0] && place.address_components[0].short_name || '' ),
( place.address_components[1] && place.address_components[1].short_name || '' ),
( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' );
}
// Set the default marker info window with address data.
infoWindow.setContent( '
' + place.name + ' ' + address );
infoWindow.open( g_map, g_marker );
// Run Geolocation.
redux.field_objects.google_maps.geoLocate( g_autoComplete );
// Fill in address inputs.
redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete );
}
);
// Marker drag.
google.maps.event.addListener(
g_marker,
'drag',
function ( event ) {
document.getElementById( latitude ).value = event.latLng.lat();
document.getElementById( longitude ).value = event.latLng.lng();
}
);
// End marker drag.
google.maps.event.addListener(
g_marker,
'dragend',
function () {
redux_change( el.find( '.redux_framework_google_maps' ) );
}
);
// Zoom Changed.
g_map.addListener(
'zoom_changed',
function () {
el.find( '.google_m_zoom_input' ).val( g_map.getZoom() );
}
);
// Marker Info Window.
infoWindow = new google.maps.InfoWindow();
google.maps.event.addListener(
g_marker,
'click',
function () {
const marker_info = containerID + '_marker_info';
const infoValue = document.getElementById( marker_info ).value;
if ( '' !== infoValue ) {
infoWindow.setContent( infoValue );
infoWindow.open( g_map, g_marker );
}
}
);
};
/* FILL IN ADDRESS FUNCTION */
redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) {
// Set variables.
const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' );
// What if someone only wants city, or state, ect...
// gotta do it this way to check for the address!
// Need to check each of the returned components to see what is returned.
const componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
// Get the place details from the autocomplete object.
const place = g_autoComplete.getPlace();
let component;
let i;
let addressType;
let _d_addressType;
let val;
let len;
document.getElementById( latitude ).value = place.geometry.location.lat();
document.getElementById( longitude ).value = place.geometry.location.lng();
for ( component in componentForm ) {
if ( componentForm.hasOwnProperty( component ) ) {
// Push in the dynamic form element ID again.
component = containerID + '_' + component;
// Assign to proper place.
document.getElementById( component ).value = '';
document.getElementById( component ).disabled = false;
}
}
// Get each component of the address from the place details
// and fill the corresponding field on the form.
len = place.address_components.length;
for ( i = 0; i < len; i += 1 ) {
addressType = place.address_components[i].types[0];
if ( componentForm[addressType] ) {
// Push in the dynamic form element ID again.
_d_addressType = containerID + '_' + addressType;
// Get the original.
val = place.address_components[i][componentForm[addressType]];
// Assign to proper place.
document.getElementById( _d_addressType ).value = val;
}
}
};
redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) {
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(
function ( position ) {
const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude );
const circle = new google.maps.Circle(
{
center: geolocation,
radius: position.coords.accuracy
}
);
g_autoComplete.setBounds( circle.getBounds() );
}
);
}
};
/* API BUTTON CLICK HANDLER */
redux.field_objects.google_maps.clickHandler = function ( el ) {
// Find the API Key button and react on click.
el.find( '.google_m_api_key_button' ).on(
'click',
function () {
// Find message wrapper.
const wrapper = el.find( '.google_m_api_key_wrapper' );
if ( wrapper.is( ':visible' ) ) {
// If the wrapper is visible, close it.
wrapper.slideUp(
'fast',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
} else {
// If the wrapper is visible, open it.
wrapper.slideDown(
'medium',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
}
}
);
el.find( '.google_m_autocomplete' ).on(
'keypress',
function ( e ) {
if ( 13 === e.keyCode ) {
e.preventDefault();
}
}
);
// Auto select autocomplete contents,
// since Google doesn't do this inherently.
el.find( '.google_m_autocomplete' ).on(
'click',
function ( e ) {
$( this ).trigger( 'focus' );
$( this ).trigger( 'select' );
e.preventDefault();
}
);
};
} )( jQuery );
Mucchio Bonus di nuovo Contatti hitnspin Promozioni – Orchid Group Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
In scelta, scegliendo la annotazione contatto SPID, è verosimile acquisire un premio ancora adatto pari a 50€ ancora 50 giri a sbafo. Poi aver portato 10€ ho ospitato il reputazione premio di nuovo i free spin in capo a qualche qua. La basamento mi ha richiesto anche la controllo del verbale per permettere l’voto.
Contatti hitnspin: Promozioni di 888casino
Corrente campione di gratifica è reiteratamente il passato richiamo tra il scommettitore anche la basamento, fungendo da celebre magnete a procedere nuovi fruitori. Raggiungi il situazione del bisca come offre la pubblicità come ti interessa anche crea un nuovo competenza di artificio. Potrai preferire il gratifica privato di base da te esperto proprio sopra Contatti hitnspin parte di registrazione oppure ottenerlo seguendo la maniera guidata, quale per certi casi richiede la controllo dell’account. Non ricevere giammai un bonus escludendo deposito immediato nel caso che non hai precedentemente ottomana attentamente il ordinamento. Semmai di un circostanza di base assai poco o requisiti di puntata abbondante elevati a le tue insistenza potresti non risiedere per piacere di prendere le vincite ottenute.
Come, per un prigioniero di 20x contro 20 euro dovrai gareggiare almeno 400 euro sopra insieme. La pagina dei termini di nuovo condizioni di un bonus a scrocco include una scusa dettagliata concernente l’occasionale abuso di corrente tipo di impegno. Soprattutto, il bonus dovrà abitare giocato un convinto numero di volte (a caso 30x, 35x, 40x) sopra luogo ai requisiti di giro impostati dal casinò per l’tempo (scorri la scritto verso maggiori informazioni). Sisal vuol comporre la discordanza sopra un bonus di benvenuto davvero corroborante!
Leggi il regola anche le condizioni di ritiro
Il riserva giochi dedicato da 888Casino sorprende per la segno ancora la segno di titoli ad esempio lo compongono. Il Live Mucchio di 888 mette verso scelta diverse room di roulette, blackjack, baccarat addirittura poker per croupier dal acuto ancora altissima tecnica streaming a la lancio delle sessioni di inganno. Più queste quattro opzioni, annoveriamo il Live Games Shows anche l’Elite Lounge, una room per i giocatori più assidui della basamento. Dal un portamento tipicamente tecnico, l’accesso verso 888Casino non prevede l’impiego di client perché è facile giocare direttamente dal browser, escludendo dover ricorrere verso programmi aggiuntivi. La spianata si caratterizza a un’ottima permanenza verso posizione di server, i caricamenti sono rapidi anche i giochi facilmente fruibili.
Bonus sport Betaland: 100 € verso le scommesse sportive
Le vincite generate vengono convertite per fun premio, che deve essere rigiocato 10 volte entro il situazione di principio a poter risiedere trasformato con real gratifica.
Occorrerà indi loggarsi verso togliere il confusione online contro Androis oppure su iOS.
Questa motto di gratifica coltiva un verbale di fidanza ancora onestà con il casinò addirittura il atleta, rafforzando il rapporto di sbieco il riconoscimento delle sfide incontrate.
Competente di ogni modello di slot games, ma ancora grande affascinato di giochi dal vivace.
Il gratifica è suddiviso con tranche del tariffa di 10€ ognuna di nuovo puoi sbloccarle qualsiasi acrobazia che conquisti 135 Bonus Points. Avrai 90 giorni per liberare insieme il premio addirittura, prima esperto corrente margine nubifragio, la parte non sbloccata andrà persa. Puoi prendere il bonus in assenza di deposito per il confusione facilmente completando la registrazione addirittura richiedendo il considerazione dedica. 888 è un casinò online di sospiro enorme, accorto a l’fiducia della basamento ancora verso un stringa giochi bene addirittura variegato.
Invero, il play premio slot Goldbet deve abitare giocato 40 volte con 3 giorni dalla sua divisione, di nuovo la guadagno aforisma trasportabile sopra ricchezza prelevabile corrisponde all’80% del bonus ospitato. Abbiamo segnato che il talento di giochi oppure mercanzia sui quali usare i mucchio gratifica senza tenuta nei migliori siti bisca variano di operatore in operatore né vi è una regola ossessione per ciascuna peculiarità di premio. Facilmente, il bookmaker seleziona dei giochi ovvero mercanzia da associare al gratifica privato di tenuta, contrassegnandoli in etichette specifiche verso situazione di nuovo app ovverosia specificandoli nei T&C.
Trova il casino con free spin avvenimento verso verso per te
Se non hai alloggiato il tuo bonus in assenza di deposito, molto presumibilmente non hai temuto i termini di nuovo le condizioni dell’promessa. La davanti bene da eleggere è provare se hai compiuto qualsivoglia i requisiti necessari. Qualora hai equilibrato anche ritieni di avere luogo idoneo, contatta il favore acquirenti del casinò.
Ma, tali recensioni addirittura direzione vanno intese verso solo affinché informativo né vanno considerate alla criterio di consigli legali. Assicurati sempre di soddisfare ogni i requisiti previsti dalla norma precedentemente di giocare con qualunque casinò. A i giocatori come amano il poker, le password freeroll di 888 poker possono abitare accompagnate da condizioni di imposizione.
A conti fatti si intervallo di un’offerta proprio anche tuttavia è autorevole aspirare qualunque modo per prendere il ideale. Per prendere il bonus, appresso, bisogna eleggere istanza per la arena di catalogazione. Fu terminato corrente passaggio, appresso, ti arriverà una mail anche dovrai cliccare sul link come trovi all’azzurri. Sebbene riguarda i prelievi anziché, potrai utilizzare qualunque i metodi citati escluso PostePay.
È autorevole occupare attuale come gli eventuali crediti derivanti dal premio escludendo cambio devono appagare determinati requisiti, a poter avere luogo trasformati con ricchezza esperto ancora allora prelevabile. Di nuovo Betsson è entro gli operatori quale in arena di catalogazione permette di ottenere un premio interezza. Potrai, invero, acquisire un premio a sbafo di 200€ diviso sopra 5 scaglioni ogni da 20€ a mucchio ancora 20€ verso esercizio per wagering stesso per 35x. William Hill offre l’opportunità di ricevere magro verso 50€ in assenza di fondo per SPID, immediatamente ulteriormente l’apertura del competenza, escludendo bramare la controllo dei autenticazione.